﻿using System;
using System.Net.Mail;
using System.Text;
using System.Configuration;
using System.Globalization;
using System.Collections.Specialized;
using System.Collections.Generic;
using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;
using System.Linq;
using System.Security.Principal;
using System.Web;
using System.IO;
using System.Data.SqlClient;
using IntraVision.Web;
using IntraVision.Web.Security;
using Model;

public class RegistrationController : LoginController<NotarialServiceDataContext, Person>
{
    public RegistrationController()
    {
        RegisterScript("form.js", "jquery.validate.pack.js", "jquery.validate.additional.js", "registration/registration.js");
        _UserSelectCommand = ("Email=@0 and Password=@1 and !IsArchive and IsActivated");
        TemplatePath = "~/views/registration.haml";
        LayoutPath = "~/views/layouts/page.haml";
    }

    public override void Default()
    {
        ViewData["entity"] = new Person();
        RenderView();
    }

    public void Save()
    {
        var entity = new Person();
        using (var dc = new NotarialServiceDataContext())
        {
            try
            {
                RequestHelper.InitializeFromRequest<Person>(Request, entity);
                dc.Connection.Open();
                dc.Transaction = dc.Connection.BeginTransaction();
                if (String.Equals(Session["CaptchaText"], Request["captcha"]))
                {
                    entity.RoleId = 2;
                    entity.Password = RequestHelper.MD5Encode(entity.Password);
                    dc.GetTable<Person>().InsertOnSubmit(entity);
                    dc.SubmitChanges();

                    try
                    {
                        //отправка уведомления об активации
                        var link = String.Format(CultureInfo.InvariantCulture, "{0}registration.ivp/activate/{1}/{2}", ViewData["Base"], entity.Email, RequestHelper.MD5Encode(entity.Email));

                        var body = ConfigurationManager.AppSettings["registrationmessage"] ?? "Для активации учетной записи кликните по этой ссылке: %link% \r\nЕсли Вы не понимаете о чем идет речь – просто удалите это письмо.";

                        var path = Request.PhysicalApplicationPath + body;
                        if (File.Exists(path))
                            body = File.ReadAllText(path, Encoding.Default);

                        string subject = ConfigurationManager.AppSettings["activateaccountsubject"] ?? "Активация учетной записи";

                        body = body.Replace("%clientfio%", entity.FIO)
                            .Replace("%email%", entity.Email)
                            .Replace("%link%", link);


                        this.SendEmail(entity.Email, subject, body, false);
                    }
                    catch (Exception ex) 
                    { string m = ex.Message; }
                }
                else
                    throw new ArgumentException("INVALID_CAPTURE");
            }
            catch (SqlException ex)
            {
                var wex = SqlExceptionHelper.WrapException(ex);
                ViewData["message"] = wex.Message;
            }
            catch (Exception ex)
            {

                ViewData["message"] = ex.Message;
            }

            ViewData["entity"] = entity;
            if (!ViewData.ContainsKey("message") || String.IsNullOrEmpty(ViewData["message"] as string))
            {
                dc.Transaction.Commit();
                dc.Connection.Close();
                ViewData["isOK"] = true;
                ViewData["message"] = "REGISTRATION_FINISHED";
                RenderView();
            }
            else
            {
                dc.Transaction.Rollback();
                dc.Connection.Close();
                
                RenderView();
            }
        }

    }

    public void Activate(string mail, string hash)
    {
        try
        {
            if (String.Equals(hash, RequestHelper.MD5Encode(mail)))
                using (var dc = new NotarialServiceDataContext())
                {
                    var person = dc.Persons.FirstOrDefault(p => p.Email == mail);
                    if (person != null)
                    {
                        string loginlink = String.Format("<a href=\"{0}\">Перейти на главную страницу<a/>", ViewData["Base"]);
                        if (!person.IsActivated)
                        {
                            person.IsActivated = true;
                            dc.SubmitChanges();

                            ViewData["message"] = String.Format("Учетная запись активирована. Можете начать работу с заявками после прохождения процедуры авторизации. {0}", loginlink);
                            ViewData["isOK"] = true;
                        }
                        else
                        {
                            throw new Exception(String.Format("учетная запись {0} уже активирована. Для начала работы с системой пройдите процедуру авторизации. {1}.", mail, loginlink)); 
                        }
                    }
                    else
                    {
                        string reglink = String.Format("<a href=\"{0}registration.ivp\">регистрации<a/>", ViewData["Base"]);
                        throw new Exception(String.Format("клиент с email {0} не найден в базе данных, попробуйте пройти заново процедуру {1}.", mail, reglink)); 
                    }
                }
            else
                throw new Exception("код активации неверный.");
        }
        catch (Exception ex)
        {
            ViewData["activationfailed"] = true;
            ViewData["message"] = string.Format("Не удалось активировать учетную запись: {0}",ex.Message);
        }
        ViewData["entity"] = new Person();
        RenderView();
    }

    protected void SendEmail(string to, string subject, string body, bool isBodyHtml)
    {
        string host = ConfigurationManager.AppSettings["smtphost"] ?? "localhost";
        string from = ConfigurationManager.AppSettings["mailfrom"];
        int port;
        if (!Int32.TryParse(ConfigurationManager.AppSettings["smtpport"], out port))
            port = 25;

        var smtp = new SmtpClient(host, port);
        var mm = new MailMessage(from, to);

        mm.Subject = subject;
        mm.Body = body.Replace("%br%", "<br/>");
        mm.IsBodyHtml = isBodyHtml;

        smtp.Send(mm);
    }

    protected void SendEmail(string to, string subject, string body)
    {
        SendEmail(to, subject, body, true);
    }
}